package examples 
{
	import Box2D.Collision.Shapes.b2PolygonShape;
	import Box2D.Collision.b2AABB;
	import Box2D.Common.Math.b2Vec2;
	import Box2D.Dynamics.b2Body;
	import Box2D.Dynamics.b2BodyDef;
	import Box2D.Dynamics.b2DebugDraw;
	import Box2D.Dynamics.b2FixtureDef;
	import Box2D.Dynamics.b2World;
	import pure.engine.events.EntityMouseEvent;
	import pure.engine.events.WorldMouseEvent;
	
	import examples.Config;
	
	import flash.display.BitmapData;
	import flash.events.MouseEvent;
	
	import pure.engine.Despair;
	import pure.engine.system.InputManager;
	import pure.engine.status.motion.PlatformMotion;
	import pure.engine.entity.EntityManager;
	import pure.engine.entity.IEntity;
	import pure.engine.events.WorldContentEvent;
	import pure.engine.renderer.AnimationRenderer;
	import pure.engine.scenery.ImageScenery;
	import pure.engine.scenery.TiledScenery;
	import pure.engine.world.CustomWorldContent;
	import pure.engine.world.TiledWorldContent;
	import pure.utils.DesU;
	
	/**
	 * ...
	 * @author Pure
	 */
public class Box2DWorld extends TiledWorldContent 
{
	
	public function Box2DWorld() 
	{
		super(Config.landform, 32);
		createWorld();
		
		createGround();
	}
	
	
	[Embed(source = 'PlatformMapSheet.png')]private var PlatformMapSheet:Class;

	private var platformMapSheet:BitmapData;
	protected var m_entity:IEntity;
	private var m_renderer:AnimationRenderer;
	private var m_platform:PlatformMotion;
	
	public static var world:b2World;
	private var body:b2Body;
	public var m_physScale:Number = 30;
	private var steady:Boolean;
	
	override public function exit():void
	{
		body = null;
		m_platform = null;
		m_renderer = null;
		m_entity = null;
		platformMapSheet.dispose();
		platformMapSheet = null;
	}
	
	
	override public function enter():void
	{
		platformMapSheet = new PlatformMapSheet().bitmapData;
		
		//var s:TiledScenery = new TiledScenery(renderData.concat(),platformMapSheet,this);
		this.createTiledScenery(platformMapSheet, renderData, 32);
		
		this.addEventListener(EntityMouseEvent.CLICK, ____onWorldClick);
	}
	
	private function ____onWorldClick(e:WorldMouseEvent):void
	{
		
		createBody(e.worldX,e.worldY);
	}
	
	override public function update(elapsedT:Number):void
	{
		if (Despair.input.justPressed('D'))
		{
			for (var bb:b2Body = world.GetBodyList(); bb; bb = bb.GetNext()){
				if (bb.GetUserData() is IEntity){
					world.DestroyBody(bb);
				}
			}
			
			var list:Array = Despair.getEntities('PhysicsShape');
			if (list == null) return;
			var entity:IEntity;
			var len:int = list.length;
			for (var i:int = len-1; i >=0; i--) {
				entity = list[i];
				entity.kill();
			}
			DesU.gc();
		}
		if (Despair.input.justPressed('Q'))
		{
			steady = !steady;
		}
		
		world.Step(1/30, 10,10);
		world.ClearForces();
		
		for (bb = world.GetBodyList(); bb; bb = bb.GetNext()){
			if (bb.GetUserData() is IEntity){
				var E:IEntity = bb.GetUserData() as IEntity;
				E.x = bb.GetPosition().x * 30;
				E.y = bb.GetPosition().y * 30;
				E.headRenderer.angle = bb.GetAngle();
			}
		}
	}
				   
	private function createWorld():void
	{
			//2.声明重力
			var gravity:b2Vec2 = new b2Vec2(0.0, 10.0);
			//3.睡着的对象是否模拟
			var doSleep:Boolean = true;
			//4.创建b2World世界
			world = new b2World(gravity, doSleep);
			world.SetWarmStarting(true);
	}


	private function createBody(posX:Number,posY:Number):void
	{
		m_entity = this.createFinalEntity('PhysicsShape',posX,posY,5,10,10,steady);
		
		trace(world.GetBodyCount())
	}

	private function createGround():void
	{
		var len:int = _landformData.length;
		for (var i:int = 0; i < len; i++) 
		{
			var lenB:int = _landformData[0].length;
			for (var j:int = 0; j < lenB; j++) 
			{
				if (_landformData[i][j] > 0)
				{
					tileBlock(j * 32 + 16, i * 32 + 16);
				}
			}
		}

	}
	
	private function tileBlock(wx:Number, wy:Number):void
	{
		//1.创建刚体需求b2BodyDef
		var bodyRequest:b2BodyDef = new b2BodyDef();
		bodyRequest.position.Set(wx / 30,wy/30);//记得米和像素的转换关系
		//2.Box2D世界工厂更具需求创建createBody()生产刚体
		body=world.CreateBody(bodyRequest);
		//3.创建敢提形状需求b2ShapeDef的子类
		var shapeRequest:b2PolygonShape = new b2PolygonShape();
		//详细说明我们的需求
		shapeRequest.SetAsBox(16/30, 16/30);
		var fixtureRequest:b2FixtureDef = new b2FixtureDef();
		fixtureRequest.shape=shapeRequest;
		fixtureRequest.density = 0;
		fixtureRequest.friction = 0.3;
		fixtureRequest.restitution = 0.2;
		//4.b2Body刚体工厂根据需求createShape生产形状
		body.CreateFixture(fixtureRequest);
	}
	
	public static var renderData:Array = [[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,77,78,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,93,94,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,29,29,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,29,29,29,29,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,29,29,29,29,29,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,59,59,-1,-1,-1,-1,29,29,29,29,29,29,29,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,59,59,59,-1,-1,-1,29,29,29,29,29,29,29,29,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1],
[44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44],
[36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36]]
	   
}

}